// MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "TF_CAX.h"


#include "TF_CAXDoc.h"
#include "TF_CAXView.h"


#include "MainFrm.h"
#include "../TF_Reader/tf_LineReader.h"
#include "../TF_Reader/tf_StlReader.h"

#include "../TF_Geom/tf_Line.h"
#include "../TF_Geom/tf_Element.h"

using namespace std;
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_COMMAND(ID_IMPORTLINE, OnImportline)
	ON_COMMAND(ID_IMPORTELE, OnImportele)
	ON_COMMAND(ID_ZOOMALL, OnZoomall)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

static UINT indicators[] =
{
	ID_SEPARATOR,           // status line indicator
	ID_INDICATOR_CAPS,
	ID_INDICATOR_NUM,
	ID_INDICATOR_SCRL,
};

/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction

CMainFrame::CMainFrame()
{
	// TODO: add member initialization code here
	
}

CMainFrame::~CMainFrame()
{
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}

	if (!m_wndStatusBar.Create(this) ||
		!m_wndStatusBar.SetIndicators(indicators,
		  sizeof(indicators)/sizeof(UINT)))
	{
		TRACE0("Failed to create status bar\n");
		return -1;      // fail to create
	}

	// TODO: Delete these three lines if you don't want the toolbar to
	//  be dockable
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	EnableDocking(CBRS_ALIGN_ANY);
	DockControlBar(&m_wndToolBar);

	return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
	CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CFrameWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers


void CMainFrame::OnImportline() 
{
	// TODO: Add your command handler code here
	char fileName[1024];
	CFileDialog pCFileDialog(true,NULL,NULL,0,"(*.lin)|*.lin"); 
	pCFileDialog.m_ofn.lpstrTitle = "import Line ";
	
	if(pCFileDialog.DoModal()!=IDOK) 
	{ 
		return; 
	}
	
	strcpy(fileName,pCFileDialog.GetPathName());
	CLineReader tfLineReader(fileName);
	vector< std::vector<TfPoint> > LineVec;
	tfLineReader.Read();
	tfLineReader.GetLineVec(LineVec);

	int i,j;
	vector<int> ndVec;
	for (i = 0; i < LineVec.size();i++)
	{
		for (j = 0; j < LineVec[i].size();j++)
		{
			ndVec.push_back(TfNdMng.CreateNode(LineVec[i][j]));
		}
		TfLinMng.CreateLine(ndVec,1);
		ndVec.clear();
	}


	vector<int> partLineVec;
	vector<int> ndLineVec;
	double pt1[3],pt2[3];
	TfLinMng.GetPartLines(1,partLineVec);
	for (i = 0; i < partLineVec.size();i++)
	{
		TfLinMng.GetLineNodes(partLineVec[i],ndLineVec);
		for (j = 0; j < ndLineVec.size()-1;j++)
		{
			TfNdMng.GetNodePoint(ndLineVec[j],pt1);
			TfNdMng.GetNodePoint(ndLineVec[j+1],pt2);
		}	
		ndLineVec.clear();
	}

}

void CMainFrame::OnImportele() 
{
	// TODO: Add your command handler code here
	char fileName[1024];
	CFileDialog pCFileDialog(true,NULL,NULL,0,"(*.stl)|*.stl"); 
	pCFileDialog.m_ofn.lpstrTitle = "import STL ";
	
	if(pCFileDialog.DoModal()!=IDOK) 
	{ 
		return; 
	}
	
	strcpy(fileName,pCFileDialog.GetPathName());

	CStlReader tfEleReader(fileName);
	tfEleReader.Read(fileName);

	StlVector EleVec;
	EleVec = tfEleReader.GetPtrArray();


	int i,id;
	double pt[3];
	int node[8];
	int nodeNum = 3;
	STL_TRIANGLE* p_tritem;

	for (i = 0;i < EleVec.size();i++)
	{
		pt[0] = EleVec[i]->vertex[0].x;
		pt[1] = EleVec[i]->vertex[0].y;
		pt[2] = EleVec[i]->vertex[0].z;
		node[0] = TfNdMng.CreateNode(pt);
		pt[0] = EleVec[i]->vertex[1].x;
		pt[1] = EleVec[i]->vertex[1].y;
		pt[2] = EleVec[i]->vertex[1].z;
		node[1] = TfNdMng.CreateNode(pt);
		pt[0] = EleVec[i]->vertex[2].x;
		pt[1] = EleVec[i]->vertex[2].y;
		pt[2] = EleVec[i]->vertex[2].z;
		node[2] = TfNdMng.CreateNode(pt);
		TfEmMng.CreateElement(node,nodeNum,1);
	}
}

void CMainFrame::OnZoomall() 
{
	// TODO: Add your command handler code here
	CTF_CAXView *pView = (CTF_CAXView *)this->GetActiveView();

	pView->ZoomAll();
}
